﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;

namespace CapaDatos.Adapters
{

  public  class VigenciaParametroAdapter
    {



          BDRinconLuzEntities contexto;

        public VigenciaParametroAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

        public VigenciaParametroAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }

        public void Agregar(VigenciaParametro entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

        public void Eliminar(VigenciaParametro entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<VigenciaParametro> objectSet = contexto.CrearSet<VigenciaParametro>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



        public void Modificar(VigenciaParametro entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.SaveChanges();
        }


        public IEnumerable<VigenciaParametro> Obtener()
        {
            return contexto.CrearSet<VigenciaParametro>();
        }


        public List<ViewEntity> ObtenerParametros()
        {

            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var Lista = (from v in contexto.Parametro
                            select v).ToList();

               
            foreach (var item in Lista)
            {
                ListaFinal.Add(new ViewEntity(item.IdParametro, item.NombreParametro));
            }

            return ListaFinal;
        }


        public string ObtenerCuotaVigente()
        {

            var Existe = (from v in contexto.VigenciaParametro
                           where v.Parametro.NombreParametro == "Valor de la Cuota mensual" &&
                                v.FechaHasta == null
                           select v.Valor).Any();

            if (Existe)
            {
                var Vigente = (from v in contexto.VigenciaParametro
                               where v.Parametro.NombreParametro == "Valor de la Cuota mensual" &&
                                    v.FechaHasta == null
                               select v.Valor).First();

                return Vigente;

            }
            else
                return "NO";
        }


        public string ObtenerCuotaVigenteEnPeriodo(string mes, int año)
        {

            DateTime periodo = new DateTime(año, ObtenerNumeroMes(mes), 1);

            var Ultima = (from v in contexto.VigenciaParametro
                          where v.Parametro.NombreParametro == "Valor de la Cuota mensual" &&
                                v.FechaHasta == null
                          select v).First();

            if (Ultima.FechaDesde < periodo)
            {
                return Ultima.Valor;

            }
            else
            {
                var Anterior = (from v in contexto.VigenciaParametro
                               where v.Parametro.NombreParametro == "Valor de la Cuota mensual" 
                              select v.FechaDesde).Min();

                if (Anterior > periodo)
                {
                    var Vigente = (from v in contexto.VigenciaParametro
                                   where v.Parametro.NombreParametro == "Valor de la Cuota mensual" &&
                                        v.FechaDesde == Anterior
                                   select v.Valor).First();

                    return Vigente;

                }
                else
                {
                    var Medio = (from v in contexto.VigenciaParametro
                                  where v.Parametro.NombreParametro == "Valor de la Cuota mensual" &&
                                        v.FechaDesde <= periodo &&
                                        v.FechaHasta >= periodo
                                  select v).First();

                    return Medio.Valor;

                }


            }



        }



        public bool ExistenVigencias(Guid idParametro)
        {

            var Existen = (from v in contexto.VigenciaParametro
                           where v.IdParametro == idParametro &&
                           v.FechaHasta == null
                           select v).Any();

            return Existen;
        }


        public VigenciaParametro ObtenerVigente(Guid idParametro)
        {

            var Entidad = (from v in contexto.VigenciaParametro
                           where v.IdParametro == idParametro &&
                           v.FechaHasta == null
                           select v).First();

            return Entidad;

        }


        public string ObtenerPrecioInscripcionVigente()
        {

            var Existe = (from v in contexto.VigenciaParametro
                          where v.Parametro.NombreParametro == "Valor de la Inscripción" &&
                               v.FechaHasta == null
                          select v.Valor).Any();

            if (Existe)
            {
                var Vigente = (from v in contexto.VigenciaParametro
                               where v.Parametro.NombreParametro == "Valor de la Inscripción" &&
                                    v.FechaHasta == null
                               select v.Valor).First();

                return Vigente;

            }
            else
                return "NO";
        }





        internal int ObtenerNumeroMes(string mes)
        {

            switch (mes)
            {

                case "Enero":
                    return 1;

                case "Febrero":
                    return 2;

                case "Marzo":
                    return 3;

                case "Abril":
                    return 4;

                case "Mayo":
                    return 5;

                case "Junio":
                    return 6;

                case "Julio":
                    return 7;

                case "Agosto":
                    return 8;

                case "Septiembre":
                    return 9;

                case "Octubre":
                    return 10;

                case "Noviembre":
                    return 11;

                case "Diciembre":
                    return 12;

                default: return 0;

            }


        }





    }
}
